from pathlib import Path
from pyecharts import options as opts
from pyecharts.charts import Bar

class TopInstitutesGenerator:
    """机构专利数量柱状图生成器"""
    
    def __init__(self):
        self.color = "#5470c6"
    
    def generate(self, data, save_path, title=None):
        """生成机构专利数量柱状图
        
        Args:
            data: Dict[str, int] - 机构专利数据
                格式: {"机构名": 专利数量}
            save_path: str - 保存路径
            title: str - 图表标题（可选）
        """
        # 按专利数量排序
        sorted_data = dict(sorted(data.items(), key=lambda x: x[1], reverse=True))
        
        # 创建图表实例
        bar = Bar(
            init_opts=opts.InitOpts(
                width="600px",  # 宽度
                height="400px",  # 高度
                bg_color="#ffffff"
            )
        )
        
        # 添加数据
        bar.add_xaxis(list(sorted_data.keys()))
        bar.add_yaxis(
            series_name="",  # 不显示系列名
            y_axis=list(sorted_data.values()),
            label_opts=opts.LabelOpts(position="top", font_size=10),  # 在柱子顶部显示数值，字体缩小
            itemstyle_opts=opts.ItemStyleOpts(color=self.color),
            category_gap="40%",  # 调整柱状宽度，值越大柱子越窄
        )
        
        # 设置全局配置
        bar.set_global_opts(
            title_opts=opts.TitleOpts(
                is_show=False,
                title=title or "机构专利申请TOP10",
                pos_left="center",
                pos_top="5px",  # 标题距离顶部 5px
                title_textstyle_opts=opts.TextStyleOpts(font_size=14)  # 标题字体大小
            ),
            xaxis_opts=opts.AxisOpts(
                type_="category",
                name="机构",
                name_location="end",
                axislabel_opts=opts.LabelOpts(
                    rotate=45,  # 机构名称倾斜显示
                    font_size=10,  # 缩小字体
                    margin=5  # 增加标签与图表的间距
                ),
                axisline_opts=opts.AxisLineOpts(
                    linestyle_opts=opts.LineStyleOpts(width=2)  # 增加 X 轴线宽
                )
            ),
            yaxis_opts=opts.AxisOpts(
                type_="value",
                name="专利数量",
                name_location="end",
                name_gap=10,  # 缩小 Y 轴名称与轴线的距离
                axislabel_opts=opts.LabelOpts(
                    font_size=10  # 缩小字体
                ),
                axisline_opts=opts.AxisLineOpts(
                    linestyle_opts=opts.LineStyleOpts(width=2)  # 增加 Y 轴线宽
                )
            ),
            tooltip_opts=opts.TooltipOpts(
                trigger="axis",
                axis_pointer_type="shadow"
            )
        )
        
        # 生成图表
        bar.render(save_path)
        return save_path